<?php
defined('BASEPATH') OR exit('No direct script access allowed');

/**
 * 访问权限
 *
 * @desc
 * @version 1.0.0
 * @author  Jason
 * @date    2017年5月9日 下午6:23:41
 * 
 * @version	2.0.0
 * @author	Jason
 * @desc	公共库函数不应依赖控制器级的业务数据，故不应该引用 CI->session！
 * 			代之，需要引进 $member 参数，中间层过渡数据！！
 * 			故而，去掉 private @var CI_Session $session！
 * @date	2017年6月16日 下午2:12:43
 */
class Lib_permission
{
	/** @var CI_Controller */
	private $CI;
	
	/** @var Mod_role */
	private $mod_role = null;
	
	public function __construct()
	{
		$this->CI =& get_instance();
		
		$this->CI->load->model('mod_role');
		$this->mod_role =& $this->CI->mod_role;
	}
	
	/**
	 * 检查访问权限
	 * 
	 * @desc    description
	 * @author  Jason
	 * @date    2017年5月9日 下午9:22:07
	 * 
	 * @param array $member ['id' => '10000', 'role_id' => '100', 'role_ids' => ['100', '101', '102']]
	 * @param mixed $action string/null
	 * 
	 * @return boolean
	 */
	public function check_access($member, $action = null)
	{
		// 处理参数
		if (empty($action)) {
			$directory = $this->CI->router->fetch_directory(); // eg: "manage/" or null
			$class = $this->CI->router->fetch_class();
			$method = $this->CI->router->fetch_method();
			$action = "$directory$class/$method";
		}
		
		if (!$this->check_member_integrity($member)) {
			return false;
		}
		
		$actions = $this->get_permission_by_member($member);
		$actions = array_column($actions, 'code');
		
		if (!in_array($action, $actions)) {
			return false;
		}
		
		return true;
	}
	
	public function check_resource_authority($resource,$role, $member)
	{
	
	}
	
	/**
	 * 根据用户信息获取权限信息
	 * 
	 * @desc	将来可以凭 用户ID 或者 角色ID 获取权限信息
	 * @todo	TODO 将来可以凭 用户ID 或者 角色ID 获取权限信息
	 * @author	Jason
	 * @date	2017年6月16日 下午2:03:31
	 *
	 * @param	array $member
	 *
	 * @return	array
	 */
	protected function get_permission_by_member($member)
	{
		$role_id = isset($member['role_id']) ? $member['role_id'] : '-1';
		$actions = $this->mod_role->get_role_actions($role_id);
		return $actions;
	}
	
	/**
	 * 判断传进来的用户是否有鉴权所必须的信息 - 检查用户数据完整性
	 * 
	 * @version	2.0.0
	 * @desc	公共库函数不应依赖控制器级的业务数据，故不应该引用 CI->session!, 所以需要引进 $member 参数，中间层过渡数据!!
	 * @date	2017年6月16日 下午2:00:11
	 * 
	 * @version	2.1.0
	 * @desc	检查用户数据完整性
	 * @date	2017年6月16日 下午2:22:36
	 * 
	 * @desc	只要能获得 用户ID 或者 角色ID 都认为具备条件
	 * @todo	TODO 将来可以凭 用户ID 或者 角色ID 获取权限信息
	 * @author	Jason
	 * @date	2017年6月16日 下午2:00:11
	 * 
	 * @param	array $member
	 * 
	 * @return	boolean
	 */
	protected function check_member_integrity($member)
	{
		//return !empty($member['id']) || !empty($member['role_id']) || !empty($member['role_ids']);
		return !(empty($member['id']) && empty($member['role_id']) && empty($member['role_ids']));
	}
	
}